<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
</head>
<body>
这里是样式
</body>
</html>
<script>
// javascript 提供了对象与实力两个
// 所有的实力都继承来自 对象 对象才是最大的 对象又自己的方法属性  实力也是有的
// 但是实力接触多有对象的方法 对象点什么就是点他的方法
Object.obj=function(o){ //ObJECT的方法 就是定义在prototype 上的可以直接使用的
    console.log(o);
}
// Object的实例方法

// 所谓实例方法就是定义在Object原型对象Object.prototype上的方法。它可以被Object实例直接使用。
Object.prototype.myFunction=function(pp){
    console.log(pp);//实则是定义在 protope
}
var x = myFunction(777777);
var obj=new Object();
// obj.myFunction()
console.log(obj.myFunction());

// 实例直接可以使用对象上的方法
var pp=function(p){ // 实例举例的方法
    console.log(p);
}
//  解释一下上面的  通过在Object.prototype 上定义了一个 myFunction的方法
// 然后通过 new  object  产出了一个obj 实例 然后obj 调用了 myFunction 这个方法 所有说  obj 继承了 prototype的方法


// Object 可以当一个工具使用 然后就可以使用它判断一个值是不是 一个对象 installof 因为object 必须是一个对象
// 所有就很好提醒
var obj=new Object(44);
 obj instanceof Object;
 obj instanceof Number //这是一个特殊的方法
//  如果object 方法的参数是一个对象 它总是会返回对象的本身 是不用转换的
    function update(val){
        return val===Object(val)
    }
    update([]);
    update(true) // false
    //  Object 静态方法
    //  Object.keys();
    //  Object.keys方法和Object.getOwnPropertyNames方法都用来遍历对象的属性。

    var  obj={
        p1:"222",
        p2:"222"
    }
 Object.keys(obj) // p1,p2
//  Object.getOwnPropertyNames方法与Object.keys类似，也是接受一个对象作为参数，返回一个数组，包含了该对象自身的所有属性名。

var obj = {
  p1: 123,
  p2: 456
};

Object.getOwnPropertyNames(obj) // ["p1", "p2"]
// 对于一般的对象来说，Object.keys()和Object.getOwnPropertyNames()返回的结果是一样的。只有涉及不可枚举属性时，才会有不一样的结果。Object.keys方法只返回可枚举的属性
// （详见《对象属性的描述对象》一章），Object.getOwnPropertyNames方法还返回不可枚举的属性名。
var a = ['Hello', 'World'];

Object.keys(a) // ["0", "1"]
Object.getOwnPropertyNames(a) // ["0", "1", "length"]
//  这里说一下枚举的问题  意思就是有的属性是不可以遍历的 可枚举 就是可以遍历的  不可以枚举的就是不可遍历的

// 由于 JavaScript 没有提供计算对象属性个数的方法，所以可以用这两个方法代替。

var obj = {
  p1: 123,
  p2: 456
};

Object.keys(obj).length // 2值可以使用 length来计算属性的个数
Object.getOwnPropertyNames(obj).length // 2
// 一般情况下，几乎总是使用Object.keys方法，遍历对象的属性
Object //的实例方法
//除了静态方法，还有不少方法定义在Object.prototype对象。它们称为实例方法，所有Object的实例对象都继承了这些方法。

//Object实例对象的方法，主要有以下六个。

Object.prototype.valueOf();//返回当前对象对应的值。
Object.prototype.toString();//返回当前对象对应的字符串形式。
Object.prototype.toLocaleString();//返回当前对象对应的本地字符串形式。
Object.prototype.hasOwnProperty();//判断某个属性是否为当前对象自身的属性，还是继承自原型对象的属性。
Object.prototype.isPrototypeOf();//判断当前对象是否为另一个对象的原型。
Object.prototype.propertyIsEnumerable();//判断某个属性是否可枚举。


Object.prototype.valueOf()
// valueOf方法的作用是返回一个对象的“值”，默认情况下返回对象本身。

var obj = new Object(44);
obj.valueOf() === obj // true
console.log(obj.valueOf());// 44 返回了自身的一个值 但是自动转换的时候会默认调用这个方法


var obj = new Object();
obj.valueOf = function () {
  return 2;
};

1 + obj // 3

// 上面代码自定义了obj对象的valueOf方法，
// 于是1 + obj就得到了3。这种方法就相当于用自定义的obj.valueOf，覆盖Object.prototype.valueOf。

Object.prototype.toString()
// toString方法的作用是返回一个对象的字符串形式，默认情况下返回类型字符串。
var o1 = new Object();
o1.toString() // "[object Object]"

var o2 = {a:1};
 // "[object Object]"
console.log(JSON.stringify(o2.toString()) );

// 上面代码表示，对于一个对象调用toString方法，会返回字符串[object Object]，该字符串说明对象的类型。
// 字符串[object Object]本身没有太大的用处，但是通过自定义toString方法，可以让对象在自动类型转换时，得到想要的字符串形式。

var obj = new Object();

obj.toString = function () {
  return 'hello';
};

obj + ' ' + 'world' // "hello world"

 [1,2,3].toString();
  (function(){
      return 123;
  }).toString()//调用这个方法
// 需要调用 自定义的 valof 与 tostring 覆盖原来的
//   上面代码中，数组、字符串、函数、Date 对象调用toString方法，
//   并不会返回[object Object]，因为它们都自定义了toString方法，覆盖原始方法。

// Object.prototype.toString方法返回对象的类型字符串，因此可以用来判断一个值的类型。

var obj = {};
obj.toString() // "[object Object]"

</script>